package org.rpc.common;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

import static org.rpc.common.constants.RpcConstants.MAGIC_NUMBER;

public class RpcDecoder extends ByteToMessageDecoder {
    /**
     * 协议的开头部分的标准长度
     */
    public final int BASE_LENGTH = 2 + 4;

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 收到的必须要大于协议头的长度，因为小于协议头的话，就不是一个真正的包
        if (in.readableBytes() >= BASE_LENGTH) {
            // 目前固定最大包为1000,后期可以配置
            if(in.readableBytes() >1000){
                // 跳过不读取
                in.skipBytes(in.readableBytes());
            }
            int beginReader;
            while (true){
                // 下一个可读指针
               beginReader = in.readerIndex();
               // 记住当前的位置
               in.markReaderIndex();
                if (in.readShort() == MAGIC_NUMBER) {
                    break;
                } else {
                    // 不是魔数开头，说明是非法的客户端发来的数据包
                    ctx.close();
                    return;
                }
            }
            // 读取下一个整形
            int length = in.readInt();
            //说明剩余的数据包不是完整的，这里需要重置下读索引
            if (in.readableBytes() < length) {
                in.readerIndex(beginReader);
                return;
            }
            byte[] data = new byte[length];
            // 读取到这个字节数组中
            in.readBytes(data);
            // 转换一下
            RpcProtocol rpcProtocol = new RpcProtocol(data);
            // 写到下一个处理器上
            out.add(rpcProtocol);
        }
    }
}
